package com.efast.cafe.portal.service.api.impl;



import java.util.Date;
import java.util.List;
import java.util.UUID;

import com.efast.cafe.framework.exception.ServiceException;
import com.efast.cafe.framework.util.SpringWebUtils;
import com.efast.cafe.framework.util.VersionUtil;
import com.efast.cafe.portal.bean.api.ApiModuleDefineBean;
import com.efast.cafe.portal.bean.api.ApiModuleDefineQueryBean;
import com.efast.cafe.portal.bean.api.ApiRequestUriBean;
import com.efast.cafe.portal.dao.api.ApiInputParamDao;
import com.efast.cafe.portal.dao.api.ApiModuleDefineDao;
import com.efast.cafe.portal.dao.api.ApiModuleRequriDefDao;
import com.efast.cafe.portal.dao.api.ApiOutputParamDao;
import com.efast.cafe.portal.dao.api.ApiRequestUriDao;
import com.efast.cafe.portal.dao.api.ApiSystemDefineDao;
import com.efast.cafe.portal.dao.api.ApiSystemModuleDefDao;
import com.efast.cafe.portal.entity.api.ApiSystemDefine;
import com.efast.cafe.portal.entity.api.ApiSystemModuleDef;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import com.efast.cafe.portal.service.api.IApiModuleDefineService;
import com.github.pagehelper.PageHelper;



/**
 * <p>Service接口实现类</p>
 * <p>Table: api_module_define - 所属模块定义</p>
 *
 * @since 2017-01-16 06:21:11
 */
@Service
@Transactional
public class ApiModuleDefineServiceImpl implements IApiModuleDefineService{

	private ApiModuleDefineDao apiModuleDefineDao;
	
	private ApiSystemModuleDefDao apiSystemModuleDefDao;
	
	private ApiSystemDefineDao apiSystemDefineDao;
	
	private ApiModuleRequriDefDao apiModuleRequriDefDao;
	
	private ApiRequestUriDao apiRequestUriDao;
	
	private ApiInputParamDao apiInputParamDao;
	
	private ApiOutputParamDao apiOutputParamDao;
	
	
	
	@Autowired
	public void setApiOutputParamDao(ApiOutputParamDao apiOutputParamDao) {
		this.apiOutputParamDao = apiOutputParamDao;
	}

	@Autowired
	public void setApiRequestUriDao(ApiRequestUriDao apiRequestUriDao) {
		this.apiRequestUriDao = apiRequestUriDao;
	}

	@Autowired
	public void setApiModuleRequriDefDao(ApiModuleRequriDefDao apiModuleRequriDefDao) {
		this.apiModuleRequriDefDao = apiModuleRequriDefDao;
	}

	@Autowired
	public void setApiSystemDefineDao(ApiSystemDefineDao apiSystemDefineDao) {
		this.apiSystemDefineDao = apiSystemDefineDao;
	}

	@Autowired
	public void setApiModuleDefineDao(ApiModuleDefineDao apiModuleDefineDao) {
		this.apiModuleDefineDao = apiModuleDefineDao;
	}
	
	@Autowired
	public void setApiSystemModuleDefDao(ApiSystemModuleDefDao apiSystemModuleDefDao) {
		this.apiSystemModuleDefDao = apiSystemModuleDefDao;
	}

	@Autowired
	public void setApiInputParamDao(ApiInputParamDao apiInputParamDao) {
		this.apiInputParamDao = apiInputParamDao;
	}

	/**
	 * 查询模块
	 * {@inheritDoc} 
	 * overridden:
	 * @Date        :      2017年1月18日
	 * @see com.efast.cafe.portal.remote.api.ApiModuleDefineService#querylistPosition(com.efast.cafe.portal.bean.api.ApiModuleDefineQueryBean)
	*
	 */
	@Override
	public ApiModuleDefineQueryBean querylistPosition(ApiModuleDefineQueryBean queryForm) {
		PageHelper.startPage(queryForm.getStart(), queryForm.getLength());
		queryForm.setResultList(apiModuleDefineDao.querylistPosition(queryForm));
		queryForm.setTotalRows(apiModuleDefineDao.queryCount(queryForm));
		return queryForm;
	}

	/**
	 * 新增模块
	 * {@inheritDoc} 
	 * overridden:
	 * @Date        :      2017年1月18日
	 * @see com.efast.cafe.portal.remote.api.ApiModuleDefineService#saveApiModuledefine(com.efast.cafe.portal.bean.api.ApiModuleDefineBean)
	*
	 */
	@Override
	public int saveApiModuledefine(ApiModuleDefineBean apiModuleInsertBean) {
		int count = apiSystemModuleDefDao.moduleIdIsExist(apiModuleInsertBean);
		if(count != 0){
		    throw new ServiceException("msg.portal.api.module.path.exist");
		}
			//新增模块
		      Integer id=apiModuleInsertBean.getId();
		    if(id!=null&&!"".equals(id.toString())){
		    	//升版导致模块复制
		    	apiModuleInsertBean.setParentId(id);
		    }
			apiModuleInsertBean.setCreateTime(new Date());
			apiModuleInsertBean.setCreateUser(SpringWebUtils.getRequestUser());
			apiModuleInsertBean.setLastUpdateTime(new Date());
			apiModuleInsertBean.setOptCounter(1);
			apiModuleInsertBean.setLastUpdateUser(SpringWebUtils.getRequestUser());
			apiModuleInsertBean.setIsDel((byte) 0);
			if(apiModuleInsertBean.getModuleVersion()==null||"".equals(apiModuleInsertBean.getModuleVersion())){
				apiModuleInsertBean.setModuleVersion("0.0.1");
			}			
			if(apiModuleInsertBean.getObjId()==null){
			apiModuleInsertBean.setObjId(UUID.randomUUID().toString());
			}
			apiModuleDefineDao.saveApiModuledefine(apiModuleInsertBean);
			//新增系统模块关系
			ApiSystemModuleDef apiSystemModuleDef = new ApiSystemModuleDef();		
			apiSystemModuleDef.setLastUpdateTime(new Date());
			apiSystemModuleDef.setLastUpdateUser(SpringWebUtils.getRequestUser());
			//设置系统模块关系表的moduleId
			apiSystemModuleDef.setId(apiModuleInsertBean.getId());
			apiSystemModuleDef.setModuleId(apiModuleInsertBean.getId());		
			apiSystemModuleDef.setCreateTime(new Date());
			apiSystemModuleDef.setCreateUser(SpringWebUtils.getRequestUser());
			apiSystemModuleDef.setSystemId(apiModuleInsertBean.getSystemId());
			apiSystemModuleDefDao.saveSystemModuleDef(apiSystemModuleDef);							
		return apiModuleInsertBean.getId();
	}

	/**
	 * 通过id查询单个模块
	 * {@inheritDoc} 
	 * overridden:
	 * @Date        :      2017年1月18日
	 * @see com.efast.cafe.portal.remote.api.ApiModuleDefineService#queryApiModuleDefineById(int)
	*
	 */
	@Override
	public ApiModuleDefineBean queryApiModuleDefineById(Integer systemId,Integer moduleId) {
		return apiModuleDefineDao.queryApiModuleDefineById(systemId,moduleId);
	}

	/**
	 * 修改模块
	 * {@inheritDoc} 
	 * overridden:
	 * @Date        :      2017年1月18日
	 * @see com.efast.cafe.portal.remote.api.ApiModuleDefineService#updateModuleDefine(com.efast.cafe.portal.bean.api.ApiModuleDefineBean)
	*
	 */
	@Override
	public void updateModuleDefine(ApiModuleDefineBean apiModuleInsertBean) {	
		ApiModuleDefineBean moduleDefineBean = apiModuleDefineDao.queryApiModuleDefineById(apiModuleInsertBean.getSystemId(), apiModuleInsertBean.getId());
		if(moduleDefineBean==null){
			throw new ServiceException("msg.portal.api.updated");
		}
		byte statusBefore = moduleDefineBean.getModuleStatus();
		//如果模块当前模块已经是发布状态,修改模块则升版
		if(statusBefore==1){
			//将导致模块升版,
			moduleAndSystemUpGrade(apiModuleInsertBean, false);
		}else{
			apiModuleInsertBean.setLastUpdateTime(new Date());
			apiModuleInsertBean.setLastUpdateUser(SpringWebUtils.getRequestUser());
			apiModuleInsertBean.setIsDel((byte) 0);
			apiModuleDefineDao.updateModuleDefine(apiModuleInsertBean);
			if(statusBefore!=apiModuleInsertBean.getModuleStatus()){
				//系统不升版，但模块下的uri状态发生变更。
				ApiRequestUriBean apiRequestUri = new ApiRequestUriBean();
				apiRequestUri.setLastUpdateTime(new Date());
				apiRequestUri.setLastUpdateUser(SpringWebUtils.getRequestUser());
				apiRequestUri.setModuleId(apiModuleInsertBean.getId());
				apiRequestUri.setReqUriStatus(apiModuleInsertBean.getModuleStatus());
				apiRequestUriDao.statusChangedByModuleStatus(apiRequestUri);
			}
		}	
	}

	
	/**
	 * 通过systemId查询system的所有模块
	 * @Date        :      2017年1月18日
	 * @param queryForm
	 * @return
	 */
	@Override
	public List<ApiModuleDefineBean> querylistModuleBySystemId(Integer systemId) {
		return apiModuleDefineDao.querylistModuleBySystemId(systemId);
	}

	/**
	 * 重用模块，建立关系
	 * @Date        :      2017年2月7日
	 * @param apiSystemModuleDef
	 * @return
	 */
	@Override
	public int reuseModule(ApiSystemModuleDef apiSystemModuleDef) {		
		//复制系统模块关系
		apiSystemModuleDefDao.saveSystemModuleDef(apiSystemModuleDef);		
		return apiSystemModuleDef.getId();
	}
	
	/**
	 * 模块升版操作
	 * @param apiModuleInsertBean
	 */
	public Integer moduleAndSystemUpGrade(ApiModuleDefineBean apiModuleInsertBean, boolean isByUri) {
		Integer newModuleId=null;
		Byte status = apiModuleInsertBean.getModuleStatus();
		if (status != 3) {
			throw new ServiceException("msg.portal.api.module.status.dev");
		}
		// 查询模块所属系统,检查是否引起系统升版
		ApiSystemDefine apiSystemDefine = apiSystemDefineDao.findSystemDetailsById(apiModuleInsertBean.getSystemId());
		if (apiSystemDefine.getSystemStatus() == 1) {
			apiSystemDefine.setParentId(apiSystemDefine.getId());
			apiSystemDefine.setSystemStatus(3);
			String sysNewVersion = VersionUtil.newVersion(apiSystemDefine.getSystemVersion());
			apiSystemDefine.setSystemVersion(sysNewVersion);
			//产生新版系统
			apiSystemDefineDao.addNewSystem(apiSystemDefine);
			// 将原系统的模块关系全部复制到新系统中
			apiSystemModuleDefDao.copySystemModuleDefList(apiSystemDefine.getParentId(), apiSystemDefine.getId(),
					SpringWebUtils.getRequestUser());			
			// 替换更新的模块
			newModuleId=moduleUpGrade(apiModuleInsertBean, apiSystemDefine.getId(), isByUri);
		}else{
			//如果系统没有升版，仅模块升版，应删除老模块与uri的关系
			newModuleId= moduleUpGrade(apiModuleInsertBean, apiSystemDefine.getId(), isByUri);
			if(isByUri){
				apiModuleRequriDefDao.deleteUriDefByModuleId(apiModuleInsertBean.getParentId());
			}
		}
		return newModuleId;
	}
     /**
      * 对指定系统下的模块升版
      * @param apiModuleInsertBean
      * @param systemInfoBean
      * @Date 2017-4-26
      */
	private Integer moduleUpGrade(ApiModuleDefineBean apiModuleInsertBean, Integer systemId, boolean isByUri) {
		apiModuleInsertBean.setSystemId(systemId);
		// 当系统未处于发布状态系统不升版,仅模块升版,删除当前系统模块关系
		String newVersion = VersionUtil.newVersion(apiModuleInsertBean.getModuleVersion());
		apiModuleInsertBean.setModuleVersion(newVersion);
	
		//如果不是由uri升版导致模块升版，则应删除系统与老模块之间的关系
		apiSystemModuleDefDao.deleteSystemModuleDef(apiModuleInsertBean.getSystemId(), apiModuleInsertBean.getId());
		
		// 产生新模块副本，并返回主键
		apiModuleInsertBean.setParentId(apiModuleInsertBean.getId());
		//产生新模块，并生成新模块与系统的关系。
		saveApiModuledefine(apiModuleInsertBean);
		String requestUser = SpringWebUtils.getRequestUser();
		// 产生新模块与uri的关系
		apiModuleRequriDefDao.copyModuleUrisDef(apiModuleInsertBean.getParentId(), apiModuleInsertBean.getId(), requestUser);		
		return apiModuleInsertBean.getId();
	}
}